/*
 * Created on 2005-3-9
 */
package com.hd123.rumba.runtime;

import java.lang.reflect.Field;
import java.util.Date;
import java.util.HashMap;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;

import org.apache.log4j.Logger;

import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.exception.ParameterException;
import com.hd123.rumba.util.ClassifiedHashtable;

/**
 * <b>注：</b>要求具体的Manager必须定义标题caption（提供给操作日志使用），具体定义一个名为"CAPTION_MANAGER"的常量：<br>
 * <code>public static final String CAPTION_MANAGER = "<i>Manager标题</i>";</code>
 * 
 * @author caili
 */
public class Manager implements IManager {

  public Manager() {
    super();

    // 取得Manager的标题Caption
    Field[] fields = this.getClass().getDeclaredFields();
    for (int i = 0; i < fields.length; i++)
      try {
        if ("CAPTION_MANAGER".equals(fields[i].getName()))
          caption = (String) fields[i].get(null);
      } catch (IllegalArgumentException e) {
      } catch (IllegalAccessException e) {
      }
  }

  public Session getSession() throws HibernateException {
    return HibernateSession.getSession();
  }

  public Logger getLogger() {
    return Logger.getLogger(this.getClass());

  }

  public void saveEntity(BaseEntity entity) throws HibernateException {
    entity.setLastModified(new Date());
    getSession().saveOrUpdate(entity);
  }

  public void checkParameterNotNull(Object param, String paramName) throws ParameterException {
    if (param == null)
      throw new ParameterException("必须的参数" + paramName + "不能为null");
  }

  /**
   * 实体接口与实现类对照表。
   */
  protected HashMap classRegistry = new HashMap();

  /**
   * 注册实体接口与实现类关系。
   * 
   * @param intfName
   * @param className
   */
  protected void registryClass(String intfName, String className) {
    classRegistry.put(intfName, className);
  }

  public String lookupClass(Class intf) {
    return (String) classRegistry.get(intf.getName());
  }

  private String caption = this.getClass().getSimpleName();

  public String getCaption() {
    return caption;
  }

  /**
   * 提供对于实体的共享检查。
   * 
   * @param entity 被检查的实体对象。
   * @param oca 
   * @param classCaption 实体名，例如：IUser.CAPTION_CLASS
   * @param entitySpec 实体描述，例如：user.getCodeName();
   * @return
   * @throws BusinessException
   * @deprecated
   */
  protected ClassifiedHashtable checkOca(IVersionedPersistent entity, long oca,
      String classCaption, String entitySpec) throws BusinessException {
    if (entity.getOca() != oca) {
      ClassifiedHashtable h = new ClassifiedHashtable();
      h.putMessage("oca", ClassifiedHashtable.ERROR, "指定" + classCaption + "已经被其他用户修改"
          + "，您所做的修改将被取消(" + entitySpec + ")。");
      return h;
    } else
      return null;
  }

}
